{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Deep Learning Models -- A collection of various deep learning architectures, models, and tips for TensorFlow and PyTorch in Jupyter Notebooks.\n",
    "- Author: Sebastian Raschka\n",
    "- GitHub Repository: https://github.com/rasbt/deeplearning-models"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Sebastian Raschka \n",
      "\n",
      "CPython 3.7.3\n",
      "IPython 7.6.1\n",
      "\n",
      "tensorflow 1.13.1\n"
     ]
    }
   ],
   "source": [
    "%load_ext watermark\n",
    "%watermark -a 'Sebastian Raschka' -v -p tensorflow"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Model Zoo -- General Adversarial Networks"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Implementation of General Adversarial Nets (GAN) where both the discriminator and generator are multi-layer perceptrons with one hidden layer only. In this example, the GAN generator was trained to generate MNIST images.\n",
    "\n",
    "Uses\n",
    "\n",
    "- samples from a random normal distribution (range [-1, 1])\n",
    "- dropout\n",
    "- leaky relus\n",
    "- ~~batch normalization~~ [performs worse here]\n",
    "- separate batches for \"fake\" and \"real\" images (where the labels are 1 = real images, 0 = fake images)\n",
    "- MNIST images normalized to [-1, 1] range\n",
    "- generator with tanh output\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'/device:GPU:0'"
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import numpy as np\n",
    "import tensorflow as tf\n",
    "from tensorflow.examples.tutorials.mnist import input_data\n",
    "import pickle as pkl\n",
    "\n",
    "tf.test.gpu_device_name()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "WARNING:tensorflow:From <ipython-input-3-5955a43821e7>:17: read_data_sets (from tensorflow.contrib.learn.python.learn.datasets.mnist) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "Please use alternatives such as official/mnist/dataset.py from tensorflow/models.\n",
      "WARNING:tensorflow:From /home/raschka/miniconda3/lib/python3.7/site-packages/tensorflow/contrib/learn/python/learn/datasets/mnist.py:260: maybe_download (from tensorflow.contrib.learn.python.learn.datasets.base) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "Please write your own downloading logic.\n",
      "WARNING:tensorflow:From /home/raschka/miniconda3/lib/python3.7/site-packages/tensorflow/contrib/learn/python/learn/datasets/mnist.py:262: extract_images (from tensorflow.contrib.learn.python.learn.datasets.mnist) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "Please use tf.data to implement this functionality.\n",
      "Extracting MNIST_data/train-images-idx3-ubyte.gz\n",
      "WARNING:tensorflow:From /home/raschka/miniconda3/lib/python3.7/site-packages/tensorflow/contrib/learn/python/learn/datasets/mnist.py:267: extract_labels (from tensorflow.contrib.learn.python.learn.datasets.mnist) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "Please use tf.data to implement this functionality.\n",
      "Extracting MNIST_data/train-labels-idx1-ubyte.gz\n",
      "Extracting MNIST_data/t10k-images-idx3-ubyte.gz\n",
      "Extracting MNIST_data/t10k-labels-idx1-ubyte.gz\n",
      "WARNING:tensorflow:From /home/raschka/miniconda3/lib/python3.7/site-packages/tensorflow/contrib/learn/python/learn/datasets/mnist.py:290: DataSet.__init__ (from tensorflow.contrib.learn.python.learn.datasets.mnist) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "Please use alternatives such as official/mnist/dataset.py from tensorflow/models.\n",
      "WARNING:tensorflow:From <ipython-input-3-5955a43821e7>:64: dense (from tensorflow.python.layers.core) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "Use keras.layers.dense instead.\n",
      "WARNING:tensorflow:From /home/raschka/miniconda3/lib/python3.7/site-packages/tensorflow/python/framework/op_def_library.py:263: colocate_with (from tensorflow.python.framework.ops) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "Colocations handled automatically by placer.\n",
      "WARNING:tensorflow:From <ipython-input-3-5955a43821e7>:67: dropout (from tensorflow.python.layers.core) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "Use keras.layers.dropout instead.\n"
     ]
    }
   ],
   "source": [
    "### Abbreviatiuons\n",
    "# dis_*: discriminator network\n",
    "# gen_*: generator network\n",
    "\n",
    "########################\n",
    "### Helper functions\n",
    "########################\n",
    "\n",
    "def leaky_relu(x, alpha=0.0001):\n",
    "    return tf.maximum(alpha * x, x)\n",
    "\n",
    "\n",
    "########################\n",
    "### DATASET\n",
    "########################\n",
    "\n",
    "mnist = input_data.read_data_sets('MNIST_data')\n",
    "\n",
    "\n",
    "#########################\n",
    "### SETTINGS\n",
    "#########################\n",
    "\n",
    "# Hyperparameters\n",
    "learning_rate = 0.001\n",
    "training_epochs = 100\n",
    "batch_size = 64\n",
    "dropout_rate = 0.5\n",
    "\n",
    "# Other settings\n",
    "print_interval = 200\n",
    "\n",
    "# Architecture\n",
    "dis_input_size = 784\n",
    "gen_input_size = 100\n",
    "\n",
    "dis_hidden_size = 128\n",
    "gen_hidden_size = 128\n",
    "\n",
    "\n",
    "#########################\n",
    "### GRAPH DEFINITION\n",
    "#########################\n",
    "\n",
    "g = tf.Graph()\n",
    "with g.as_default():\n",
    "    \n",
    "    # Placeholders for settings\n",
    "    dropout = tf.placeholder(tf.float32, shape=None, name='dropout')\n",
    "    is_training = tf.placeholder(tf.bool, shape=None, name='is_training')\n",
    "    \n",
    "    # Input data\n",
    "    dis_x = tf.placeholder(tf.float32, shape=[None, dis_input_size], name='discriminator_input') \n",
    "    gen_x = tf.placeholder(tf.float32, [None, gen_input_size], name='generator_input')\n",
    "\n",
    "\n",
    "    ##################\n",
    "    # Generator Model\n",
    "    ##################\n",
    "\n",
    "    with tf.variable_scope('generator'):\n",
    "        # linear -> ~~batch norm~~ -> leaky relu -> dropout -> tanh output\n",
    "        gen_hidden = tf.layers.dense(inputs=gen_x, units=gen_hidden_size,\n",
    "                                      activation=None)\n",
    "        #gen_hidden = tf.layers.batch_normalization(gen_hidden, training=is_training)\n",
    "        gen_hidden = leaky_relu(gen_hidden)\n",
    "        gen_hidden = tf.layers.dropout(gen_hidden, rate=dropout_rate)\n",
    "        gen_logits = tf.layers.dense(inputs=gen_hidden, units=dis_input_size, \n",
    "                                     activation=None)\n",
    "        gen_out = tf.tanh(gen_logits, 'generator_output')\n",
    "\n",
    "\n",
    "    ######################\n",
    "    # Discriminator Model\n",
    "    ######################\n",
    "    \n",
    "    def build_discriminator_graph(input_x, reuse=None):\n",
    "        # linear -> ~~batch norm~~ -> leaky relu -> dropout -> sigmoid output\n",
    "        with tf.variable_scope('discriminator', reuse=reuse):\n",
    "            hidden = tf.layers.dense(inputs=input_x, units=dis_hidden_size, \n",
    "                                     activation=None)\n",
    "            #hidden = tf.layers.batch_normalization(hidden, training=is_training)\n",
    "            hidden = leaky_relu(hidden)\n",
    "            hidden = tf.layers.dropout(hidden, rate=dropout_rate)\n",
    "            logits = tf.layers.dense(inputs=hidden, units=1, activation=None)\n",
    "            out = tf.sigmoid(logits)\n",
    "        return logits, out    \n",
    "\n",
    "    # Create a discriminator for real data and a discriminator for fake data\n",
    "    dis_real_logits, dis_real_out = build_discriminator_graph(dis_x, reuse=False)\n",
    "    dis_fake_logits, dis_fake_out = build_discriminator_graph(gen_out, reuse=True)\n",
    "\n",
    "\n",
    "    #####################################\n",
    "    # Generator and Discriminator Losses\n",
    "    #####################################\n",
    "    \n",
    "    # Two discriminator cost components: loss on real data + loss on fake data\n",
    "    # Real data has class label 1, fake data has class label 0\n",
    "    dis_real_loss = tf.nn.sigmoid_cross_entropy_with_logits(logits=dis_real_logits, \n",
    "                                                            labels=tf.ones_like(dis_real_logits))\n",
    "    dis_fake_loss = tf.nn.sigmoid_cross_entropy_with_logits(logits=dis_fake_logits, \n",
    "                                                            labels=tf.zeros_like(dis_fake_logits))\n",
    "    dis_cost = tf.add(tf.reduce_mean(dis_fake_loss), \n",
    "                      tf.reduce_mean(dis_real_loss), \n",
    "                      name='discriminator_cost')\n",
    " \n",
    "    # Generator cost: difference between dis. prediction and label \"1\" for real images\n",
    "    gen_loss = tf.nn.sigmoid_cross_entropy_with_logits(logits=dis_fake_logits,\n",
    "                                                       labels=tf.ones_like(dis_fake_logits))\n",
    "    gen_cost = tf.reduce_mean(gen_loss, name='generator_cost')\n",
    "    \n",
    "    \n",
    "    #########################################\n",
    "    # Generator and Discriminator Optimizers\n",
    "    #########################################\n",
    "      \n",
    "    dis_optimizer = tf.train.AdamOptimizer(learning_rate)\n",
    "    dis_train_vars = tf.get_collection(tf.GraphKeys.GLOBAL_VARIABLES, scope='discriminator')\n",
    "    dis_update_ops = tf.get_collection(tf.GraphKeys.UPDATE_OPS, scope='discriminator')\n",
    "    \n",
    "    with tf.control_dependencies(dis_update_ops): # required to upd. batch_norm params\n",
    "        dis_train = dis_optimizer.minimize(dis_cost, var_list=dis_train_vars,\n",
    "                                           name='train_discriminator')\n",
    "    \n",
    "    gen_optimizer = tf.train.AdamOptimizer(learning_rate)\n",
    "    gen_train_vars = tf.get_collection(tf.GraphKeys.GLOBAL_VARIABLES, scope='generator')\n",
    "    gen_update_ops = tf.get_collection(tf.GraphKeys.UPDATE_OPS, scope='generator')\n",
    "    \n",
    "    with tf.control_dependencies(gen_update_ops): # required to upd. batch_norm params\n",
    "        gen_train = gen_optimizer.minimize(gen_cost, var_list=gen_train_vars,\n",
    "                                           name='train_generator')\n",
    "    \n",
    "    # Saver to save session for reuse\n",
    "    saver = tf.train.Saver()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Minibatch: 001 | Dis/Gen Cost:    1.499/0.801\n",
      "Minibatch: 201 | Dis/Gen Cost:    0.053/3.507\n",
      "Minibatch: 401 | Dis/Gen Cost:    0.081/2.734\n",
      "Minibatch: 601 | Dis/Gen Cost:    0.034/4.557\n",
      "Minibatch: 801 | Dis/Gen Cost:    0.039/4.194\n",
      "Epoch:     001 | Dis/Gen AvgCost: 0.118/3.638\n",
      "Minibatch: 001 | Dis/Gen Cost:    0.057/5.300\n",
      "Minibatch: 201 | Dis/Gen Cost:    0.116/3.594\n",
      "Minibatch: 401 | Dis/Gen Cost:    0.280/5.187\n",
      "Minibatch: 601 | Dis/Gen Cost:    0.194/3.634\n",
      "Minibatch: 801 | Dis/Gen Cost:    0.173/5.460\n",
      "Epoch:     002 | Dis/Gen AvgCost: 0.210/5.091\n",
      "Minibatch: 001 | Dis/Gen Cost:    0.045/7.738\n",
      "Minibatch: 201 | Dis/Gen Cost:    0.407/6.936\n",
      "Minibatch: 401 | Dis/Gen Cost:    1.025/7.490\n",
      "Minibatch: 601 | Dis/Gen Cost:    1.244/5.377\n",
      "Minibatch: 801 | Dis/Gen Cost:    0.383/8.268\n",
      "Epoch:     003 | Dis/Gen AvgCost: 0.425/6.283\n",
      "Minibatch: 001 | Dis/Gen Cost:    0.303/4.227\n",
      "Minibatch: 201 | Dis/Gen Cost:    0.920/6.391\n",
      "Minibatch: 401 | Dis/Gen Cost:    0.439/5.984\n",
      "Minibatch: 601 | Dis/Gen Cost:    0.284/6.037\n",
      "Minibatch: 801 | Dis/Gen Cost:    0.432/7.308\n",
      "Epoch:     004 | Dis/Gen AvgCost: 0.666/5.462\n",
      "Minibatch: 001 | Dis/Gen Cost:    0.412/6.210\n",
      "Minibatch: 201 | Dis/Gen Cost:    1.066/2.377\n",
      "Minibatch: 401 | Dis/Gen Cost:    0.142/4.366\n",
      "Minibatch: 601 | Dis/Gen Cost:    0.242/2.430\n",
      "Minibatch: 801 | Dis/Gen Cost:    0.605/4.105\n",
      "Epoch:     005 | Dis/Gen AvgCost: 0.724/4.420\n",
      "Minibatch: 001 | Dis/Gen Cost:    0.302/5.794\n",
      "Minibatch: 201 | Dis/Gen Cost:    0.600/7.009\n",
      "Minibatch: 401 | Dis/Gen Cost:    0.806/2.755\n",
      "Minibatch: 601 | Dis/Gen Cost:    1.148/4.533\n",
      "Minibatch: 801 | Dis/Gen Cost:    0.538/4.364\n",
      "Epoch:     006 | Dis/Gen AvgCost: 1.041/4.112\n",
      "Minibatch: 001 | Dis/Gen Cost:    1.779/2.379\n",
      "Minibatch: 201 | Dis/Gen Cost:    0.946/2.030\n",
      "Minibatch: 401 | Dis/Gen Cost:    3.150/2.253\n",
      "Minibatch: 601 | Dis/Gen Cost:    0.933/5.070\n",
      "Minibatch: 801 | Dis/Gen Cost:    0.324/4.628\n",
      "Epoch:     007 | Dis/Gen AvgCost: 1.220/3.451\n",
      "Minibatch: 001 | Dis/Gen Cost:    1.709/1.255\n",
      "Minibatch: 201 | Dis/Gen Cost:    0.811/4.043\n",
      "Minibatch: 401 | Dis/Gen Cost:    0.464/3.975\n",
      "Minibatch: 601 | Dis/Gen Cost:    0.691/4.367\n",
      "Minibatch: 801 | Dis/Gen Cost:    1.116/2.952\n",
      "Epoch:     008 | Dis/Gen AvgCost: 0.897/3.234\n",
      "Minibatch: 001 | Dis/Gen Cost:    1.047/2.900\n",
      "Minibatch: 201 | Dis/Gen Cost:    1.718/2.889\n",
      "Minibatch: 401 | Dis/Gen Cost:    1.200/4.795\n",
      "Minibatch: 601 | Dis/Gen Cost:    1.769/2.707\n",
      "Minibatch: 801 | Dis/Gen Cost:    2.332/2.182\n",
      "Epoch:     009 | Dis/Gen AvgCost: 1.177/3.189\n",
      "Minibatch: 001 | Dis/Gen Cost:    1.002/3.703\n",
      "Minibatch: 201 | Dis/Gen Cost:    2.067/4.743\n",
      "Minibatch: 401 | Dis/Gen Cost:    1.234/4.623\n",
      "Minibatch: 601 | Dis/Gen Cost:    0.854/4.411\n",
      "Minibatch: 801 | Dis/Gen Cost:    1.638/1.421\n",
      "Epoch:     010 | Dis/Gen AvgCost: 1.291/3.432\n",
      "Minibatch: 001 | Dis/Gen Cost:    1.629/2.710\n",
      "Minibatch: 201 | Dis/Gen Cost:    1.308/3.971\n",
      "Minibatch: 401 | Dis/Gen Cost:    2.249/3.359\n",
      "Minibatch: 601 | Dis/Gen Cost:    1.885/1.676\n",
      "Minibatch: 801 | Dis/Gen Cost:    1.319/2.525\n",
      "Epoch:     011 | Dis/Gen AvgCost: 1.498/3.245\n",
      "Minibatch: 001 | Dis/Gen Cost:    1.963/2.263\n",
      "Minibatch: 201 | Dis/Gen Cost:    1.135/4.232\n",
      "Minibatch: 401 | Dis/Gen Cost:    2.014/2.104\n",
      "Minibatch: 601 | Dis/Gen Cost:    1.125/2.537\n",
      "Minibatch: 801 | Dis/Gen Cost:    1.047/1.561\n",
      "Epoch:     012 | Dis/Gen AvgCost: 1.442/2.569\n",
      "Minibatch: 001 | Dis/Gen Cost:    1.365/2.689\n",
      "Minibatch: 201 | Dis/Gen Cost:    0.843/2.897\n",
      "Minibatch: 401 | Dis/Gen Cost:    1.164/2.392\n",
      "Minibatch: 601 | Dis/Gen Cost:    1.075/2.963\n",
      "Minibatch: 801 | Dis/Gen Cost:    1.559/3.283\n",
      "Epoch:     013 | Dis/Gen AvgCost: 1.481/2.584\n",
      "Minibatch: 001 | Dis/Gen Cost:    1.169/3.168\n",
      "Minibatch: 201 | Dis/Gen Cost:    2.146/2.435\n",
      "Minibatch: 401 | Dis/Gen Cost:    1.401/1.977\n",
      "Minibatch: 601 | Dis/Gen Cost:    1.242/2.711\n",
      "Minibatch: 801 | Dis/Gen Cost:    1.284/2.257\n",
      "Epoch:     014 | Dis/Gen AvgCost: 1.482/2.315\n",
      "Minibatch: 001 | Dis/Gen Cost:    1.039/2.691\n",
      "Minibatch: 201 | Dis/Gen Cost:    1.347/2.808\n",
      "Minibatch: 401 | Dis/Gen Cost:    1.038/2.143\n",
      "Minibatch: 601 | Dis/Gen Cost:    0.918/2.080\n",
      "Minibatch: 801 | Dis/Gen Cost:    0.539/4.845\n",
      "Epoch:     015 | Dis/Gen AvgCost: 1.384/2.196\n",
      "Minibatch: 001 | Dis/Gen Cost:    1.907/1.858\n",
      "Minibatch: 201 | Dis/Gen Cost:    1.775/2.612\n",
      "Minibatch: 401 | Dis/Gen Cost:    0.863/2.014\n",
      "Minibatch: 601 | Dis/Gen Cost:    0.568/1.905\n",
      "Minibatch: 801 | Dis/Gen Cost:    0.810/3.251\n",
      "Epoch:     016 | Dis/Gen AvgCost: 1.094/2.179\n",
      "Minibatch: 001 | Dis/Gen Cost:    0.740/2.500\n",
      "Minibatch: 201 | Dis/Gen Cost:    0.782/2.762\n",
      "Minibatch: 401 | Dis/Gen Cost:    1.272/2.372\n",
      "Minibatch: 601 | Dis/Gen Cost:    0.761/2.366\n",
      "Minibatch: 801 | Dis/Gen Cost:    2.352/1.841\n",
      "Epoch:     017 | Dis/Gen AvgCost: 1.066/2.450\n",
      "Minibatch: 001 | Dis/Gen Cost:    1.175/2.691\n",
      "Minibatch: 201 | Dis/Gen Cost:    0.759/2.902\n",
      "Minibatch: 401 | Dis/Gen Cost:    0.801/2.311\n",
      "Minibatch: 601 | Dis/Gen Cost:    1.014/2.195\n",
      "Minibatch: 801 | Dis/Gen Cost:    1.175/2.144\n",
      "Epoch:     018 | Dis/Gen AvgCost: 1.100/2.185\n",
      "Minibatch: 001 | Dis/Gen Cost:    0.812/1.680\n",
      "Minibatch: 201 | Dis/Gen Cost:    2.677/1.964\n",
      "Minibatch: 401 | Dis/Gen Cost:    0.624/2.512\n",
      "Minibatch: 601 | Dis/Gen Cost:    0.981/1.890\n",
      "Minibatch: 801 | Dis/Gen Cost:    1.459/1.721\n",
      "Epoch:     019 | Dis/Gen AvgCost: 1.178/2.177\n",
      "Minibatch: 001 | Dis/Gen Cost:    0.880/2.496\n",
      "Minibatch: 201 | Dis/Gen Cost:    1.203/2.107\n",
      "Minibatch: 401 | Dis/Gen Cost:    1.411/2.383\n",
      "Minibatch: 601 | Dis/Gen Cost:    0.661/2.956\n",
      "Minibatch: 801 | Dis/Gen Cost:    1.653/1.281\n",
      "Epoch:     020 | Dis/Gen AvgCost: 1.077/2.120\n",
      "Minibatch: 001 | Dis/Gen Cost:    1.325/1.552\n",
      "Minibatch: 201 | Dis/Gen Cost:    1.511/1.762\n",
      "Minibatch: 401 | Dis/Gen Cost:    0.545/2.786\n",
      "Minibatch: 601 | Dis/Gen Cost:    0.981/2.327\n",
      "Minibatch: 801 | Dis/Gen Cost:    1.124/2.572\n",
      "Epoch:     021 | Dis/Gen AvgCost: 1.235/2.125\n",
      "Minibatch: 001 | Dis/Gen Cost:    0.998/1.983\n",
      "Minibatch: 201 | Dis/Gen Cost:    1.259/1.341\n",
      "Minibatch: 401 | Dis/Gen Cost:    0.625/2.941\n",
      "Minibatch: 601 | Dis/Gen Cost:    0.714/5.057\n",
      "Minibatch: 801 | Dis/Gen Cost:    0.991/2.332\n",
      "Epoch:     022 | Dis/Gen AvgCost: 1.146/2.147\n",
      "Minibatch: 001 | Dis/Gen Cost:    0.708/2.030\n",
      "Minibatch: 201 | Dis/Gen Cost:    1.056/2.033\n",
      "Minibatch: 401 | Dis/Gen Cost:    1.246/2.583\n",
      "Minibatch: 601 | Dis/Gen Cost:    1.637/2.728\n",
      "Minibatch: 801 | Dis/Gen Cost:    1.832/1.761\n",
      "Epoch:     023 | Dis/Gen AvgCost: 1.215/2.502\n",
      "Minibatch: 001 | Dis/Gen Cost:    0.862/2.704\n",
      "Minibatch: 201 | Dis/Gen Cost:    1.137/2.953\n",
      "Minibatch: 401 | Dis/Gen Cost:    1.408/2.223\n",
      "Minibatch: 601 | Dis/Gen Cost:    0.749/1.927\n",
      "Minibatch: 801 | Dis/Gen Cost:    1.386/2.217\n",
      "Epoch:     024 | Dis/Gen AvgCost: 1.118/2.367\n",
      "Minibatch: 001 | Dis/Gen Cost:    0.772/3.150\n",
      "Minibatch: 201 | Dis/Gen Cost:    0.754/2.970\n",
      "Minibatch: 401 | Dis/Gen Cost:    1.812/2.498\n",
      "Minibatch: 601 | Dis/Gen Cost:    1.302/1.448\n",
      "Minibatch: 801 | Dis/Gen Cost:    1.737/1.535\n",
      "Epoch:     025 | Dis/Gen AvgCost: 1.098/2.251\n",
      "Minibatch: 001 | Dis/Gen Cost:    1.468/1.880\n",
      "Minibatch: 201 | Dis/Gen Cost:    0.828/2.362\n",
      "Minibatch: 401 | Dis/Gen Cost:    0.887/2.395\n",
      "Minibatch: 601 | Dis/Gen Cost:    1.148/1.352\n",
      "Minibatch: 801 | Dis/Gen Cost:    0.746/2.773\n",
      "Epoch:     026 | Dis/Gen AvgCost: 1.171/1.918\n",
      "Minibatch: 001 | Dis/Gen Cost:    0.932/1.585\n",
      "Minibatch: 201 | Dis/Gen Cost:    1.097/1.633\n",
      "Minibatch: 401 | Dis/Gen Cost:    1.325/1.310\n",
      "Minibatch: 601 | Dis/Gen Cost:    0.965/1.691\n",
      "Minibatch: 801 | Dis/Gen Cost:    1.335/2.311\n",
      "Epoch:     027 | Dis/Gen AvgCost: 1.164/1.811\n",
      "Minibatch: 001 | Dis/Gen Cost:    1.696/1.660\n",
      "Minibatch: 201 | Dis/Gen Cost:    1.549/1.011\n",
      "Minibatch: 401 | Dis/Gen Cost:    1.539/1.977\n",
      "Minibatch: 601 | Dis/Gen Cost:    1.217/2.030\n",
      "Minibatch: 801 | Dis/Gen Cost:    0.913/2.136\n",
      "Epoch:     028 | Dis/Gen AvgCost: 1.130/1.810\n",
      "Minibatch: 001 | Dis/Gen Cost:    1.261/1.633\n",
      "Minibatch: 201 | Dis/Gen Cost:    1.625/1.646\n",
      "Minibatch: 401 | Dis/Gen Cost:    1.237/1.713\n",
      "Minibatch: 601 | Dis/Gen Cost:    0.907/2.767\n",
      "Minibatch: 801 | Dis/Gen Cost:    0.920/2.089\n",
      "Epoch:     029 | Dis/Gen AvgCost: 1.137/1.996\n",
      "Minibatch: 001 | Dis/Gen Cost:    1.050/2.399\n",
      "Minibatch: 201 | Dis/Gen Cost:    1.429/1.843\n",
      "Minibatch: 401 | Dis/Gen Cost:    1.365/1.363\n",
      "Minibatch: 601 | Dis/Gen Cost:    0.744/2.369\n",
      "Minibatch: 801 | Dis/Gen Cost:    1.378/1.662\n",
      "Epoch:     030 | Dis/Gen AvgCost: 1.196/1.989\n",
      "Minibatch: 001 | Dis/Gen Cost:    0.772/2.210\n",
      "Minibatch: 201 | Dis/Gen Cost:    1.081/1.819\n",
      "Minibatch: 401 | Dis/Gen Cost:    1.405/2.020\n",
      "Minibatch: 601 | Dis/Gen Cost:    0.874/2.064\n",
      "Minibatch: 801 | Dis/Gen Cost:    1.140/1.534\n",
      "Epoch:     031 | Dis/Gen AvgCost: 1.149/1.845\n",
      "Minibatch: 001 | Dis/Gen Cost:    0.673/1.721\n",
      "Minibatch: 201 | Dis/Gen Cost:    1.039/1.507\n",
      "Minibatch: 401 | Dis/Gen Cost:    1.258/2.033\n",
      "Minibatch: 601 | Dis/Gen Cost:    1.060/2.744\n",
      "Minibatch: 801 | Dis/Gen Cost:    0.829/2.429\n",
      "Epoch:     032 | Dis/Gen AvgCost: 1.160/1.769\n",
      "Minibatch: 001 | Dis/Gen Cost:    1.357/1.201\n",
      "Minibatch: 201 | Dis/Gen Cost:    1.426/1.726\n",
      "Minibatch: 401 | Dis/Gen Cost:    0.856/1.783\n",
      "Minibatch: 601 | Dis/Gen Cost:    0.924/2.410\n",
      "Minibatch: 801 | Dis/Gen Cost:    1.203/1.522\n",
      "Epoch:     033 | Dis/Gen AvgCost: 1.135/1.975\n",
      "Minibatch: 001 | Dis/Gen Cost:    1.164/2.432\n",
      "Minibatch: 201 | Dis/Gen Cost:    1.096/1.507\n",
      "Minibatch: 401 | Dis/Gen Cost:    1.239/1.824\n",
      "Minibatch: 601 | Dis/Gen Cost:    1.192/1.348\n",
      "Minibatch: 801 | Dis/Gen Cost:    0.996/1.754\n",
      "Epoch:     034 | Dis/Gen AvgCost: 1.208/1.829\n",
      "Minibatch: 001 | Dis/Gen Cost:    1.242/1.672\n",
      "Minibatch: 201 | Dis/Gen Cost:    1.113/1.508\n",
      "Minibatch: 401 | Dis/Gen Cost:    1.252/1.732\n",
      "Minibatch: 601 | Dis/Gen Cost:    1.451/1.694\n",
      "Minibatch: 801 | Dis/Gen Cost:    2.160/1.091\n",
      "Epoch:     035 | Dis/Gen AvgCost: 1.179/1.709\n",
      "Minibatch: 001 | Dis/Gen Cost:    1.172/1.468\n",
      "Minibatch: 201 | Dis/Gen Cost:    1.029/1.332\n",
      "Minibatch: 401 | Dis/Gen Cost:    1.154/1.738\n",
      "Minibatch: 601 | Dis/Gen Cost:    1.183/1.573\n",
      "Minibatch: 801 | Dis/Gen Cost:    1.088/1.760\n",
      "Epoch:     036 | Dis/Gen AvgCost: 1.124/1.631\n",
      "Minibatch: 001 | Dis/Gen Cost:    1.012/1.819\n",
      "Minibatch: 201 | Dis/Gen Cost:    0.637/2.376\n",
      "Minibatch: 401 | Dis/Gen Cost:    1.122/1.738\n",
      "Minibatch: 601 | Dis/Gen Cost:    1.197/1.748\n",
      "Minibatch: 801 | Dis/Gen Cost:    1.577/1.326\n",
      "Epoch:     037 | Dis/Gen AvgCost: 1.058/1.737\n",
      "Minibatch: 001 | Dis/Gen Cost:    1.102/1.309\n",
      "Minibatch: 201 | Dis/Gen Cost:    1.194/1.909\n",
      "Minibatch: 401 | Dis/Gen Cost:    1.068/1.622\n",
      "Minibatch: 601 | Dis/Gen Cost:    0.813/1.146\n",
      "Minibatch: 801 | Dis/Gen Cost:    1.066/2.090\n",
      "Epoch:     038 | Dis/Gen AvgCost: 1.063/1.702\n",
      "Minibatch: 001 | Dis/Gen Cost:    0.746/2.406\n",
      "Minibatch: 201 | Dis/Gen Cost:    1.053/2.018\n",
      "Minibatch: 401 | Dis/Gen Cost:    1.828/1.306\n",
      "Minibatch: 601 | Dis/Gen Cost:    1.176/1.687\n",
      "Minibatch: 801 | Dis/Gen Cost:    0.936/1.637\n",
      "Epoch:     039 | Dis/Gen AvgCost: 1.065/1.742\n",
      "Minibatch: 001 | Dis/Gen Cost:    1.136/1.674\n",
      "Minibatch: 201 | Dis/Gen Cost:    0.920/2.337\n",
      "Minibatch: 401 | Dis/Gen Cost:    1.041/2.284\n",
      "Minibatch: 601 | Dis/Gen Cost:    0.898/1.703\n",
      "Minibatch: 801 | Dis/Gen Cost:    0.730/1.847\n",
      "Epoch:     040 | Dis/Gen AvgCost: 1.019/1.705\n",
      "Minibatch: 001 | Dis/Gen Cost:    1.108/1.857\n",
      "Minibatch: 201 | Dis/Gen Cost:    0.910/2.276\n",
      "Minibatch: 401 | Dis/Gen Cost:    0.847/1.606\n",
      "Minibatch: 601 | Dis/Gen Cost:    0.893/1.573\n",
      "Minibatch: 801 | Dis/Gen Cost:    1.135/1.412\n",
      "Epoch:     041 | Dis/Gen AvgCost: 1.037/1.742\n",
      "Minibatch: 001 | Dis/Gen Cost:    1.379/1.338\n",
      "Minibatch: 201 | Dis/Gen Cost:    1.526/1.049\n",
      "Minibatch: 401 | Dis/Gen Cost:    1.013/1.924\n",
      "Minibatch: 601 | Dis/Gen Cost:    1.119/1.600\n",
      "Minibatch: 801 | Dis/Gen Cost:    1.003/1.814\n",
      "Epoch:     042 | Dis/Gen AvgCost: 1.031/1.794\n",
      "Minibatch: 001 | Dis/Gen Cost:    1.030/2.025\n",
      "Minibatch: 201 | Dis/Gen Cost:    0.877/1.875\n",
      "Minibatch: 401 | Dis/Gen Cost:    0.921/1.640\n",
      "Minibatch: 601 | Dis/Gen Cost:    0.965/1.603\n",
      "Minibatch: 801 | Dis/Gen Cost:    0.909/1.645\n",
      "Epoch:     043 | Dis/Gen AvgCost: 1.009/1.827\n",
      "Minibatch: 001 | Dis/Gen Cost:    0.791/2.442\n",
      "Minibatch: 201 | Dis/Gen Cost:    0.838/2.087\n",
      "Minibatch: 401 | Dis/Gen Cost:    1.243/1.474\n",
      "Minibatch: 601 | Dis/Gen Cost:    0.721/1.858\n",
      "Minibatch: 801 | Dis/Gen Cost:    0.914/2.415\n",
      "Epoch:     044 | Dis/Gen AvgCost: 0.958/1.946\n",
      "Minibatch: 001 | Dis/Gen Cost:    0.702/2.619\n",
      "Minibatch: 201 | Dis/Gen Cost:    0.992/1.902\n",
      "Minibatch: 401 | Dis/Gen Cost:    1.179/1.937\n",
      "Minibatch: 601 | Dis/Gen Cost:    0.678/2.214\n",
      "Minibatch: 801 | Dis/Gen Cost:    1.052/1.813\n",
      "Epoch:     045 | Dis/Gen AvgCost: 0.911/2.090\n",
      "Minibatch: 001 | Dis/Gen Cost:    1.388/1.223\n",
      "Minibatch: 201 | Dis/Gen Cost:    0.858/1.659\n",
      "Minibatch: 401 | Dis/Gen Cost:    0.963/1.696\n",
      "Minibatch: 601 | Dis/Gen Cost:    0.817/2.054\n",
      "Minibatch: 801 | Dis/Gen Cost:    1.116/1.923\n",
      "Epoch:     046 | Dis/Gen AvgCost: 0.922/1.994\n",
      "Minibatch: 001 | Dis/Gen Cost:    1.074/1.816\n",
      "Minibatch: 201 | Dis/Gen Cost:    1.057/1.903\n",
      "Minibatch: 401 | Dis/Gen Cost:    0.974/2.285\n",
      "Minibatch: 601 | Dis/Gen Cost:    0.958/1.663\n",
      "Minibatch: 801 | Dis/Gen Cost:    0.720/2.033\n",
      "Epoch:     047 | Dis/Gen AvgCost: 0.940/1.975\n",
      "Minibatch: 001 | Dis/Gen Cost:    0.873/2.338\n",
      "Minibatch: 201 | Dis/Gen Cost:    0.994/2.113\n",
      "Minibatch: 401 | Dis/Gen Cost:    1.032/1.914\n",
      "Minibatch: 601 | Dis/Gen Cost:    0.973/1.713\n",
      "Minibatch: 801 | Dis/Gen Cost:    1.007/2.006\n",
      "Epoch:     048 | Dis/Gen AvgCost: 0.929/1.995\n",
      "Minibatch: 001 | Dis/Gen Cost:    0.796/2.331\n",
      "Minibatch: 201 | Dis/Gen Cost:    0.867/2.452\n",
      "Minibatch: 401 | Dis/Gen Cost:    0.850/2.010\n",
      "Minibatch: 601 | Dis/Gen Cost:    0.631/1.922\n",
      "Minibatch: 801 | Dis/Gen Cost:    0.972/1.750\n",
      "Epoch:     049 | Dis/Gen AvgCost: 0.924/1.972\n",
      "Minibatch: 001 | Dis/Gen Cost:    0.604/2.530\n",
      "Minibatch: 201 | Dis/Gen Cost:    0.976/1.983\n",
      "Minibatch: 401 | Dis/Gen Cost:    1.014/2.037\n",
      "Minibatch: 601 | Dis/Gen Cost:    1.226/1.931\n",
      "Minibatch: 801 | Dis/Gen Cost:    1.125/1.876\n",
      "Epoch:     050 | Dis/Gen AvgCost: 0.902/1.979\n",
      "Minibatch: 001 | Dis/Gen Cost:    0.854/1.767\n",
      "Minibatch: 201 | Dis/Gen Cost:    0.925/1.759\n",
      "Minibatch: 401 | Dis/Gen Cost:    0.840/2.344\n",
      "Minibatch: 601 | Dis/Gen Cost:    0.774/2.354\n",
      "Minibatch: 801 | Dis/Gen Cost:    1.070/1.733\n",
      "Epoch:     051 | Dis/Gen AvgCost: 0.872/2.043\n",
      "Minibatch: 001 | Dis/Gen Cost:    0.789/2.300\n",
      "Minibatch: 201 | Dis/Gen Cost:    0.614/3.100\n",
      "Minibatch: 401 | Dis/Gen Cost:    0.887/1.908\n",
      "Minibatch: 601 | Dis/Gen Cost:    0.776/1.562\n",
      "Minibatch: 801 | Dis/Gen Cost:    0.998/2.279\n",
      "Epoch:     052 | Dis/Gen AvgCost: 0.903/2.070\n",
      "Minibatch: 001 | Dis/Gen Cost:    0.802/2.421\n",
      "Minibatch: 201 | Dis/Gen Cost:    0.952/2.056\n",
      "Minibatch: 401 | Dis/Gen Cost:    0.675/2.499\n",
      "Minibatch: 601 | Dis/Gen Cost:    0.792/2.306\n",
      "Minibatch: 801 | Dis/Gen Cost:    1.190/1.979\n",
      "Epoch:     053 | Dis/Gen AvgCost: 0.875/2.092\n",
      "Minibatch: 001 | Dis/Gen Cost:    1.068/1.628\n",
      "Minibatch: 201 | Dis/Gen Cost:    1.108/1.678\n",
      "Minibatch: 401 | Dis/Gen Cost:    1.048/2.059\n",
      "Minibatch: 601 | Dis/Gen Cost:    1.113/2.057\n",
      "Minibatch: 801 | Dis/Gen Cost:    0.953/1.486\n",
      "Epoch:     054 | Dis/Gen AvgCost: 0.866/2.063\n",
      "Minibatch: 001 | Dis/Gen Cost:    1.089/1.407\n",
      "Minibatch: 201 | Dis/Gen Cost:    0.832/2.120\n",
      "Minibatch: 401 | Dis/Gen Cost:    1.001/1.995\n",
      "Minibatch: 601 | Dis/Gen Cost:    0.921/1.745\n",
      "Minibatch: 801 | Dis/Gen Cost:    0.989/2.212\n",
      "Epoch:     055 | Dis/Gen AvgCost: 0.844/2.096\n",
      "Minibatch: 001 | Dis/Gen Cost:    0.842/2.184\n",
      "Minibatch: 201 | Dis/Gen Cost:    0.837/1.958\n",
      "Minibatch: 401 | Dis/Gen Cost:    1.033/1.802\n",
      "Minibatch: 601 | Dis/Gen Cost:    0.943/2.060\n",
      "Minibatch: 801 | Dis/Gen Cost:    0.834/2.175\n",
      "Epoch:     056 | Dis/Gen AvgCost: 0.862/2.101\n",
      "Minibatch: 001 | Dis/Gen Cost:    0.922/2.310\n",
      "Minibatch: 201 | Dis/Gen Cost:    1.073/2.040\n",
      "Minibatch: 401 | Dis/Gen Cost:    0.853/1.952\n",
      "Minibatch: 601 | Dis/Gen Cost:    0.904/1.947\n",
      "Minibatch: 801 | Dis/Gen Cost:    0.944/2.081\n",
      "Epoch:     057 | Dis/Gen AvgCost: 0.873/2.043\n",
      "Minibatch: 001 | Dis/Gen Cost:    1.090/1.978\n",
      "Minibatch: 201 | Dis/Gen Cost:    1.284/1.474\n",
      "Minibatch: 401 | Dis/Gen Cost:    0.943/2.089\n",
      "Minibatch: 601 | Dis/Gen Cost:    1.055/1.573\n",
      "Minibatch: 801 | Dis/Gen Cost:    0.740/1.757\n",
      "Epoch:     058 | Dis/Gen AvgCost: 0.900/2.020\n",
      "Minibatch: 001 | Dis/Gen Cost:    0.818/2.143\n",
      "Minibatch: 201 | Dis/Gen Cost:    0.729/2.164\n",
      "Minibatch: 401 | Dis/Gen Cost:    0.920/1.911\n",
      "Minibatch: 601 | Dis/Gen Cost:    0.912/2.173\n",
      "Minibatch: 801 | Dis/Gen Cost:    0.871/1.367\n",
      "Epoch:     059 | Dis/Gen AvgCost: 0.915/1.963\n",
      "Minibatch: 001 | Dis/Gen Cost:    0.730/2.418\n",
      "Minibatch: 201 | Dis/Gen Cost:    0.949/1.898\n",
      "Minibatch: 401 | Dis/Gen Cost:    0.819/1.575\n",
      "Minibatch: 601 | Dis/Gen Cost:    0.856/2.401\n",
      "Minibatch: 801 | Dis/Gen Cost:    0.854/2.037\n",
      "Epoch:     060 | Dis/Gen AvgCost: 0.893/2.009\n",
      "Minibatch: 001 | Dis/Gen Cost:    0.781/2.354\n",
      "Minibatch: 201 | Dis/Gen Cost:    1.172/1.546\n",
      "Minibatch: 401 | Dis/Gen Cost:    0.879/1.791\n",
      "Minibatch: 601 | Dis/Gen Cost:    0.812/1.771\n",
      "Minibatch: 801 | Dis/Gen Cost:    0.884/1.892\n",
      "Epoch:     061 | Dis/Gen AvgCost: 0.929/1.906\n",
      "Minibatch: 001 | Dis/Gen Cost:    1.150/1.968\n",
      "Minibatch: 201 | Dis/Gen Cost:    0.681/2.181\n",
      "Minibatch: 401 | Dis/Gen Cost:    0.995/2.047\n",
      "Minibatch: 601 | Dis/Gen Cost:    0.833/1.952\n",
      "Minibatch: 801 | Dis/Gen Cost:    0.769/2.289\n",
      "Epoch:     062 | Dis/Gen AvgCost: 0.928/1.944\n",
      "Minibatch: 001 | Dis/Gen Cost:    1.160/2.092\n",
      "Minibatch: 201 | Dis/Gen Cost:    0.723/2.487\n",
      "Minibatch: 401 | Dis/Gen Cost:    1.002/1.868\n",
      "Minibatch: 601 | Dis/Gen Cost:    0.917/1.817\n",
      "Minibatch: 801 | Dis/Gen Cost:    0.848/2.062\n",
      "Epoch:     063 | Dis/Gen AvgCost: 0.931/1.909\n",
      "Minibatch: 001 | Dis/Gen Cost:    1.035/1.570\n",
      "Minibatch: 201 | Dis/Gen Cost:    0.967/2.279\n",
      "Minibatch: 401 | Dis/Gen Cost:    1.159/1.458\n",
      "Minibatch: 601 | Dis/Gen Cost:    1.011/2.168\n",
      "Minibatch: 801 | Dis/Gen Cost:    1.006/1.775\n",
      "Epoch:     064 | Dis/Gen AvgCost: 0.913/1.966\n",
      "Minibatch: 001 | Dis/Gen Cost:    0.911/2.114\n",
      "Minibatch: 201 | Dis/Gen Cost:    0.566/2.601\n",
      "Minibatch: 401 | Dis/Gen Cost:    1.130/2.184\n",
      "Minibatch: 601 | Dis/Gen Cost:    0.849/1.832\n",
      "Minibatch: 801 | Dis/Gen Cost:    1.059/1.766\n",
      "Epoch:     065 | Dis/Gen AvgCost: 0.931/1.954\n",
      "Minibatch: 001 | Dis/Gen Cost:    0.692/2.185\n",
      "Minibatch: 201 | Dis/Gen Cost:    0.919/1.905\n",
      "Minibatch: 401 | Dis/Gen Cost:    0.652/1.633\n",
      "Minibatch: 601 | Dis/Gen Cost:    1.256/1.778\n",
      "Minibatch: 801 | Dis/Gen Cost:    0.961/1.922\n",
      "Epoch:     066 | Dis/Gen AvgCost: 0.922/1.911\n",
      "Minibatch: 001 | Dis/Gen Cost:    0.684/1.942\n",
      "Minibatch: 201 | Dis/Gen Cost:    0.848/2.016\n",
      "Minibatch: 401 | Dis/Gen Cost:    0.831/1.920\n",
      "Minibatch: 601 | Dis/Gen Cost:    0.752/2.258\n",
      "Minibatch: 801 | Dis/Gen Cost:    1.119/1.636\n",
      "Epoch:     067 | Dis/Gen AvgCost: 0.922/1.919\n",
      "Minibatch: 001 | Dis/Gen Cost:    0.880/2.082\n",
      "Minibatch: 201 | Dis/Gen Cost:    0.802/2.038\n",
      "Minibatch: 401 | Dis/Gen Cost:    0.981/2.474\n",
      "Minibatch: 601 | Dis/Gen Cost:    0.847/2.154\n",
      "Minibatch: 801 | Dis/Gen Cost:    0.732/2.222\n",
      "Epoch:     068 | Dis/Gen AvgCost: 0.925/1.963\n",
      "Minibatch: 001 | Dis/Gen Cost:    0.917/1.813\n",
      "Minibatch: 201 | Dis/Gen Cost:    0.839/2.056\n",
      "Minibatch: 401 | Dis/Gen Cost:    0.894/1.528\n",
      "Minibatch: 601 | Dis/Gen Cost:    0.893/2.075\n",
      "Minibatch: 801 | Dis/Gen Cost:    1.144/1.701\n",
      "Epoch:     069 | Dis/Gen AvgCost: 0.953/1.883\n",
      "Minibatch: 001 | Dis/Gen Cost:    1.146/1.550\n",
      "Minibatch: 201 | Dis/Gen Cost:    0.910/1.836\n",
      "Minibatch: 401 | Dis/Gen Cost:    0.771/2.159\n",
      "Minibatch: 601 | Dis/Gen Cost:    0.794/2.206\n",
      "Minibatch: 801 | Dis/Gen Cost:    0.882/1.976\n",
      "Epoch:     070 | Dis/Gen AvgCost: 0.946/1.862\n",
      "Minibatch: 001 | Dis/Gen Cost:    1.024/2.227\n",
      "Minibatch: 201 | Dis/Gen Cost:    0.701/2.145\n",
      "Minibatch: 401 | Dis/Gen Cost:    1.103/1.465\n",
      "Minibatch: 601 | Dis/Gen Cost:    1.293/1.638\n",
      "Minibatch: 801 | Dis/Gen Cost:    0.744/2.072\n",
      "Epoch:     071 | Dis/Gen AvgCost: 0.935/1.874\n",
      "Minibatch: 001 | Dis/Gen Cost:    1.032/2.021\n",
      "Minibatch: 201 | Dis/Gen Cost:    0.738/1.859\n",
      "Minibatch: 401 | Dis/Gen Cost:    1.135/1.680\n",
      "Minibatch: 601 | Dis/Gen Cost:    0.856/1.340\n",
      "Minibatch: 801 | Dis/Gen Cost:    0.816/1.972\n",
      "Epoch:     072 | Dis/Gen AvgCost: 0.952/1.893\n",
      "Minibatch: 001 | Dis/Gen Cost:    1.001/1.478\n",
      "Minibatch: 201 | Dis/Gen Cost:    1.411/1.265\n",
      "Minibatch: 401 | Dis/Gen Cost:    0.930/2.295\n",
      "Minibatch: 601 | Dis/Gen Cost:    1.105/1.378\n",
      "Minibatch: 801 | Dis/Gen Cost:    0.925/1.804\n",
      "Epoch:     073 | Dis/Gen AvgCost: 0.953/1.845\n",
      "Minibatch: 001 | Dis/Gen Cost:    0.961/1.286\n",
      "Minibatch: 201 | Dis/Gen Cost:    0.828/2.103\n",
      "Minibatch: 401 | Dis/Gen Cost:    1.008/1.696\n",
      "Minibatch: 601 | Dis/Gen Cost:    0.778/1.847\n",
      "Minibatch: 801 | Dis/Gen Cost:    0.844/2.085\n",
      "Epoch:     074 | Dis/Gen AvgCost: 0.982/1.797\n",
      "Minibatch: 001 | Dis/Gen Cost:    0.905/1.921\n",
      "Minibatch: 201 | Dis/Gen Cost:    0.754/1.991\n",
      "Minibatch: 401 | Dis/Gen Cost:    1.016/1.657\n",
      "Minibatch: 601 | Dis/Gen Cost:    0.972/1.795\n",
      "Minibatch: 801 | Dis/Gen Cost:    1.148/1.830\n",
      "Epoch:     075 | Dis/Gen AvgCost: 0.968/1.795\n",
      "Minibatch: 001 | Dis/Gen Cost:    1.372/1.324\n",
      "Minibatch: 201 | Dis/Gen Cost:    1.200/1.701\n",
      "Minibatch: 401 | Dis/Gen Cost:    0.881/2.057\n",
      "Minibatch: 601 | Dis/Gen Cost:    1.004/2.116\n",
      "Minibatch: 801 | Dis/Gen Cost:    1.202/1.830\n",
      "Epoch:     076 | Dis/Gen AvgCost: 0.991/1.795\n",
      "Minibatch: 001 | Dis/Gen Cost:    1.057/1.560\n",
      "Minibatch: 201 | Dis/Gen Cost:    1.003/1.761\n",
      "Minibatch: 401 | Dis/Gen Cost:    0.955/1.610\n",
      "Minibatch: 601 | Dis/Gen Cost:    1.095/1.392\n",
      "Minibatch: 801 | Dis/Gen Cost:    1.100/1.507\n",
      "Epoch:     077 | Dis/Gen AvgCost: 0.961/1.742\n",
      "Minibatch: 001 | Dis/Gen Cost:    1.152/1.784\n",
      "Minibatch: 201 | Dis/Gen Cost:    0.992/1.961\n",
      "Minibatch: 401 | Dis/Gen Cost:    0.911/1.835\n",
      "Minibatch: 601 | Dis/Gen Cost:    0.809/1.638\n",
      "Minibatch: 801 | Dis/Gen Cost:    1.052/1.610\n",
      "Epoch:     078 | Dis/Gen AvgCost: 0.984/1.756\n",
      "Minibatch: 001 | Dis/Gen Cost:    0.858/1.878\n",
      "Minibatch: 201 | Dis/Gen Cost:    0.876/1.748\n",
      "Minibatch: 401 | Dis/Gen Cost:    0.924/1.538\n",
      "Minibatch: 601 | Dis/Gen Cost:    0.838/1.521\n",
      "Minibatch: 801 | Dis/Gen Cost:    0.865/2.007\n",
      "Epoch:     079 | Dis/Gen AvgCost: 0.978/1.719\n",
      "Minibatch: 001 | Dis/Gen Cost:    0.993/1.604\n",
      "Minibatch: 201 | Dis/Gen Cost:    0.886/2.165\n",
      "Minibatch: 401 | Dis/Gen Cost:    0.953/1.691\n",
      "Minibatch: 601 | Dis/Gen Cost:    0.925/1.663\n",
      "Minibatch: 801 | Dis/Gen Cost:    0.994/1.546\n",
      "Epoch:     080 | Dis/Gen AvgCost: 0.980/1.753\n",
      "Minibatch: 001 | Dis/Gen Cost:    0.925/1.650\n",
      "Minibatch: 201 | Dis/Gen Cost:    1.015/1.703\n",
      "Minibatch: 401 | Dis/Gen Cost:    0.915/1.581\n",
      "Minibatch: 601 | Dis/Gen Cost:    0.873/1.733\n",
      "Minibatch: 801 | Dis/Gen Cost:    1.039/1.695\n",
      "Epoch:     081 | Dis/Gen AvgCost: 0.977/1.740\n",
      "Minibatch: 001 | Dis/Gen Cost:    1.212/1.183\n",
      "Minibatch: 201 | Dis/Gen Cost:    1.112/1.577\n",
      "Minibatch: 401 | Dis/Gen Cost:    0.973/2.126\n",
      "Minibatch: 601 | Dis/Gen Cost:    0.606/2.113\n",
      "Minibatch: 801 | Dis/Gen Cost:    0.847/2.012\n",
      "Epoch:     082 | Dis/Gen AvgCost: 0.967/1.758\n",
      "Minibatch: 001 | Dis/Gen Cost:    0.772/1.764\n",
      "Minibatch: 201 | Dis/Gen Cost:    0.671/1.990\n",
      "Minibatch: 401 | Dis/Gen Cost:    0.844/1.877\n",
      "Minibatch: 601 | Dis/Gen Cost:    0.853/2.527\n",
      "Minibatch: 801 | Dis/Gen Cost:    0.964/1.633\n",
      "Epoch:     083 | Dis/Gen AvgCost: 0.987/1.707\n",
      "Minibatch: 001 | Dis/Gen Cost:    0.976/1.744\n",
      "Minibatch: 201 | Dis/Gen Cost:    1.072/1.362\n",
      "Minibatch: 401 | Dis/Gen Cost:    1.031/1.393\n",
      "Minibatch: 601 | Dis/Gen Cost:    0.954/1.825\n",
      "Minibatch: 801 | Dis/Gen Cost:    0.836/1.711\n",
      "Epoch:     084 | Dis/Gen AvgCost: 0.980/1.743\n",
      "Minibatch: 001 | Dis/Gen Cost:    0.921/1.526\n",
      "Minibatch: 201 | Dis/Gen Cost:    0.926/1.544\n",
      "Minibatch: 401 | Dis/Gen Cost:    1.243/1.350\n",
      "Minibatch: 601 | Dis/Gen Cost:    0.898/2.016\n",
      "Minibatch: 801 | Dis/Gen Cost:    1.004/1.656\n",
      "Epoch:     085 | Dis/Gen AvgCost: 0.996/1.671\n",
      "Minibatch: 001 | Dis/Gen Cost:    0.782/1.880\n",
      "Minibatch: 201 | Dis/Gen Cost:    0.759/1.909\n",
      "Minibatch: 401 | Dis/Gen Cost:    0.908/1.543\n",
      "Minibatch: 601 | Dis/Gen Cost:    0.959/1.884\n",
      "Minibatch: 801 | Dis/Gen Cost:    0.924/1.711\n",
      "Epoch:     086 | Dis/Gen AvgCost: 0.976/1.688\n",
      "Minibatch: 001 | Dis/Gen Cost:    0.863/1.577\n",
      "Minibatch: 201 | Dis/Gen Cost:    0.695/1.784\n",
      "Minibatch: 401 | Dis/Gen Cost:    1.120/1.191\n",
      "Minibatch: 601 | Dis/Gen Cost:    0.973/1.373\n",
      "Minibatch: 801 | Dis/Gen Cost:    0.790/1.858\n",
      "Epoch:     087 | Dis/Gen AvgCost: 0.987/1.715\n",
      "Minibatch: 001 | Dis/Gen Cost:    1.046/1.534\n",
      "Minibatch: 201 | Dis/Gen Cost:    0.862/1.680\n",
      "Minibatch: 401 | Dis/Gen Cost:    1.203/1.293\n",
      "Minibatch: 601 | Dis/Gen Cost:    1.047/1.687\n",
      "Minibatch: 801 | Dis/Gen Cost:    1.166/1.271\n",
      "Epoch:     088 | Dis/Gen AvgCost: 0.998/1.668\n",
      "Minibatch: 001 | Dis/Gen Cost:    0.939/1.627\n",
      "Minibatch: 201 | Dis/Gen Cost:    1.006/1.552\n",
      "Minibatch: 401 | Dis/Gen Cost:    1.000/2.030\n",
      "Minibatch: 601 | Dis/Gen Cost:    0.967/1.653\n",
      "Minibatch: 801 | Dis/Gen Cost:    1.079/1.452\n",
      "Epoch:     089 | Dis/Gen AvgCost: 1.003/1.628\n",
      "Minibatch: 001 | Dis/Gen Cost:    0.762/2.099\n",
      "Minibatch: 201 | Dis/Gen Cost:    1.094/1.581\n",
      "Minibatch: 401 | Dis/Gen Cost:    0.955/1.827\n",
      "Minibatch: 601 | Dis/Gen Cost:    0.913/1.636\n",
      "Minibatch: 801 | Dis/Gen Cost:    0.888/1.655\n",
      "Epoch:     090 | Dis/Gen AvgCost: 1.009/1.615\n",
      "Minibatch: 001 | Dis/Gen Cost:    1.039/1.598\n",
      "Minibatch: 201 | Dis/Gen Cost:    1.073/1.546\n",
      "Minibatch: 401 | Dis/Gen Cost:    1.064/1.819\n",
      "Minibatch: 601 | Dis/Gen Cost:    1.318/1.673\n",
      "Minibatch: 801 | Dis/Gen Cost:    1.236/1.260\n",
      "Epoch:     091 | Dis/Gen AvgCost: 1.027/1.618\n",
      "Minibatch: 001 | Dis/Gen Cost:    1.103/1.504\n",
      "Minibatch: 201 | Dis/Gen Cost:    1.076/1.272\n",
      "Minibatch: 401 | Dis/Gen Cost:    0.886/1.757\n",
      "Minibatch: 601 | Dis/Gen Cost:    1.162/1.607\n",
      "Minibatch: 801 | Dis/Gen Cost:    0.954/1.409\n",
      "Epoch:     092 | Dis/Gen AvgCost: 1.022/1.609\n",
      "Minibatch: 001 | Dis/Gen Cost:    0.949/1.956\n",
      "Minibatch: 201 | Dis/Gen Cost:    0.998/1.719\n",
      "Minibatch: 401 | Dis/Gen Cost:    0.899/1.689\n",
      "Minibatch: 601 | Dis/Gen Cost:    0.970/1.853\n",
      "Minibatch: 801 | Dis/Gen Cost:    0.832/1.923\n",
      "Epoch:     093 | Dis/Gen AvgCost: 1.029/1.599\n",
      "Minibatch: 001 | Dis/Gen Cost:    0.924/1.722\n",
      "Minibatch: 201 | Dis/Gen Cost:    1.081/1.599\n",
      "Minibatch: 401 | Dis/Gen Cost:    1.064/1.853\n",
      "Minibatch: 601 | Dis/Gen Cost:    1.064/1.687\n",
      "Minibatch: 801 | Dis/Gen Cost:    0.949/1.681\n",
      "Epoch:     094 | Dis/Gen AvgCost: 1.014/1.623\n",
      "Minibatch: 001 | Dis/Gen Cost:    1.184/1.398\n",
      "Minibatch: 201 | Dis/Gen Cost:    1.253/1.560\n",
      "Minibatch: 401 | Dis/Gen Cost:    1.275/1.165\n",
      "Minibatch: 601 | Dis/Gen Cost:    0.997/1.793\n",
      "Minibatch: 801 | Dis/Gen Cost:    0.782/1.754\n",
      "Epoch:     095 | Dis/Gen AvgCost: 1.027/1.586\n",
      "Minibatch: 001 | Dis/Gen Cost:    1.037/1.669\n",
      "Minibatch: 201 | Dis/Gen Cost:    0.920/1.356\n",
      "Minibatch: 401 | Dis/Gen Cost:    0.983/1.841\n",
      "Minibatch: 601 | Dis/Gen Cost:    1.036/1.789\n",
      "Minibatch: 801 | Dis/Gen Cost:    0.725/1.858\n",
      "Epoch:     096 | Dis/Gen AvgCost: 1.032/1.619\n",
      "Minibatch: 001 | Dis/Gen Cost:    0.962/1.652\n",
      "Minibatch: 201 | Dis/Gen Cost:    1.470/1.198\n",
      "Minibatch: 401 | Dis/Gen Cost:    1.111/1.698\n",
      "Minibatch: 601 | Dis/Gen Cost:    0.994/1.527\n",
      "Minibatch: 801 | Dis/Gen Cost:    1.331/1.572\n",
      "Epoch:     097 | Dis/Gen AvgCost: 1.055/1.564\n",
      "Minibatch: 001 | Dis/Gen Cost:    1.087/1.334\n",
      "Minibatch: 201 | Dis/Gen Cost:    1.018/1.639\n",
      "Minibatch: 401 | Dis/Gen Cost:    0.982/1.277\n",
      "Minibatch: 601 | Dis/Gen Cost:    1.133/1.765\n",
      "Minibatch: 801 | Dis/Gen Cost:    1.211/1.279\n",
      "Epoch:     098 | Dis/Gen AvgCost: 1.059/1.494\n",
      "Minibatch: 001 | Dis/Gen Cost:    0.973/1.580\n",
      "Minibatch: 201 | Dis/Gen Cost:    0.833/1.588\n",
      "Minibatch: 401 | Dis/Gen Cost:    1.061/1.590\n",
      "Minibatch: 601 | Dis/Gen Cost:    0.899/1.743\n",
      "Minibatch: 801 | Dis/Gen Cost:    0.928/2.045\n",
      "Epoch:     099 | Dis/Gen AvgCost: 1.042/1.551\n",
      "Minibatch: 001 | Dis/Gen Cost:    0.870/1.786\n",
      "Minibatch: 201 | Dis/Gen Cost:    0.913/1.308\n",
      "Minibatch: 401 | Dis/Gen Cost:    1.149/1.388\n",
      "Minibatch: 601 | Dis/Gen Cost:    1.013/1.634\n",
      "Minibatch: 801 | Dis/Gen Cost:    1.060/1.759\n",
      "Epoch:     100 | Dis/Gen AvgCost: 1.038/1.577\n"
     ]
    }
   ],
   "source": [
    "##########################\n",
    "### TRAINING & EVALUATION\n",
    "##########################\n",
    "\n",
    "with tf.Session(graph=g) as sess:\n",
    "    sess.run(tf.global_variables_initializer())\n",
    "    \n",
    "    avg_costs = {'discriminator': [], 'generator': []}\n",
    "\n",
    "    for epoch in range(training_epochs):\n",
    "        dis_avg_cost, gen_avg_cost = 0., 0.\n",
    "        total_batch = mnist.train.num_examples // batch_size\n",
    "\n",
    "        for i in range(total_batch):\n",
    "            \n",
    "            batch_x, batch_y = mnist.train.next_batch(batch_size)\n",
    "            batch_x = batch_x*2 - 1 # normalize\n",
    "            batch_randsample = np.random.uniform(-1, 1, size=(batch_size, gen_input_size))\n",
    "            \n",
    "            # Train\n",
    "            _, dc = sess.run(['train_discriminator', 'discriminator_cost:0'],\n",
    "                             feed_dict={'discriminator_input:0': batch_x, \n",
    "                                        'generator_input:0': batch_randsample,\n",
    "                                        'dropout:0': dropout_rate,\n",
    "                                        'is_training:0': True})\n",
    "            _, gc = sess.run(['train_generator', 'generator_cost:0'],\n",
    "                             feed_dict={'generator_input:0': batch_randsample,\n",
    "                                        'dropout:0': dropout_rate,\n",
    "                                        'is_training:0': True})\n",
    "            \n",
    "            dis_avg_cost += dc\n",
    "            gen_avg_cost += gc\n",
    "\n",
    "            if not i % print_interval:\n",
    "                print(\"Minibatch: %03d | Dis/Gen Cost:    %.3f/%.3f\" % (i + 1, dc, gc))\n",
    "                \n",
    "\n",
    "        print(\"Epoch:     %03d | Dis/Gen AvgCost: %.3f/%.3f\" % \n",
    "              (epoch + 1, dis_avg_cost / total_batch, gen_avg_cost / total_batch))\n",
    "        \n",
    "        avg_costs['discriminator'].append(dis_avg_cost / total_batch)\n",
    "        avg_costs['generator'].append(gen_avg_cost / total_batch)\n",
    "    \n",
    "    \n",
    "    saver.save(sess, save_path='./gan.ckpt')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "%matplotlib inline\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "plt.plot(range(len(avg_costs['discriminator'])), \n",
    "         avg_costs['discriminator'], label='discriminator')\n",
    "plt.plot(range(len(avg_costs['generator'])),\n",
    "         avg_costs['generator'], label='generator')\n",
    "plt.legend()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "WARNING:tensorflow:From /home/raschka/miniconda3/lib/python3.7/site-packages/tensorflow/python/training/saver.py:1266: checkpoint_exists (from tensorflow.python.training.checkpoint_management) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "Use standard file APIs to check for files with this prefix.\n",
      "INFO:tensorflow:Restoring parameters from ./gan.ckpt\n"
     ]
    },
    {
     "data": {
      "image/png": "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jmd1vLNOofGO82jmOhPzzlrP84Z4nlfjeV5NixaxFxRKCDre6aNjni463umi4508cVa8cwG0of9vBOCLQl9YtGgR7rrrLgDAySefDCD8CZ+fwEt56pbvBa0aoqx0ZeVav1+ykg3qX9BKV4iymljR4LEPG8+sIH3mlV+TJk2s7TruYatc3tZKKxU+ff/85z8X/FxWaEBulbZs2TLbtvbaa1u7WBmVz2dX/+QVT1pEvX64WLx4MQBgvfXWc34ed6WbZF+V0kj7NUGcXxkHoKMxpoMxpgmAPgBGJNMtRVEURalOIq94Pc9bbow5FcAoAI0BDPU8b2Kh77Ro0cKudIsl6pOffO+rr76ybc2bN8/7u6+//tra/ITPT+byJLrGGmtE6osSn3KscstREtPzPPz6668Aciu+oFWuPGVzm+sdMMOrSPlb/v4vv/xibXEclP4AwMorr2xt1wqNzwFG+sLb5/2S1X3YiiFtZ8YkV45BK92k0FVufKL6SKTtEBdHaobneSMBjEyoL4qiKIpS9WTT711RFEVRqpRYK94kCJJXXDJaFFheZvlYpIXVV1/dtl1wwQXWvvbaa61dbplTJabyc8YZZ1j7tttuA1CecTfG+ORcIFjSdslbYX1yycYsr33++efW3mSTTQD45em4TmosL7sI6/+PP/5Y8m8qxdEQHRCTpm/fvta+9957rb3mmmtWojuB6IpXURRFUVJEb7yKoiiKkiKZlZqlPaok6/IYnTdvnrW//fZbAH6v5wMOOMDazzzzjLX33XdfAMAqq6xi21gmDPOIc8nmKi+ni8jLlSAoM5XMiyBZcMmSJQCAdddd17axnPj9998DAMaMGWPb3n33XWsPGDAAAHyZhnr06GHtNm1yYfhhMfRhc1z2gb/D55YkXlhttdUKbkeJTlbl5SRfq02bNs3a66+/PgBg9913t23sqc+vDm+55RYAyHsNVCl0xasoiqIoKVLxFW8YYU9InMnHFXvLq1ReObzzzjsAgFdffdW2de3a1dr/+9//rC0v5vnJKixrEMc7Sh/ZMWattdaytuwjf0epTng+u1aRvCKWv124cKFte+6556y94YYbAgDuv/9+28bZqCRXM58XX3yRSy639957W1vid13zEsg5KQapNjK3eUXhSi84ZMiQvLYs891331lb1IalS5fatieeeMLaDzzwAAD/cd1ggw2szcepVatWifc1q0Rd5co1nOf07NmzrS3ZB/mcYSZMmGDt1q1bAwDOPvts2xbmKFhOdMWrKIqiKCmiN15FURRFSZHMS81hL+YXLFhgbZETgr7P8rBIZ5wG7uqrr7Z2ly5drC0SE8cgsoQtuMqgATmpcP78+bZt5513zutXJaWPpODxZmndJc1Xo7OZ53l2HoTtsyvNItsy355++mnb9thjj1l71qw/qo7xOcCysqRn3H777W0b/y3PxyeffBKAP669V69e1pZ0qZzykfelWKeV448/3tonnXRSUd9JCzlu7KTEYyBOanye83k8Y8aMvM8/+ugja++yS65qqrzKKncayoaMzH/OxfDzzz9bW+Yc15vm1zL82uT6668H4H+dd/HFF1vbVaKznOiKV1EURVFSRG+8iqIoipIimZeaw5b+LnkZyEmeLE3ceuut1n7xxRcB+OWfq666yto77bSTtcWrmSUo3q5IirW1tbaNPTqbNWsGAGjbtq1tkxhNoGHITa5YZPb4fPDBBwHk9hUALrzwQmt/9tlnAPySJFeq4pi7li1b5v1WQ8EYkycxs/zOUpe8ruDP2ZZx6NOnj23jalqffvopAH/sLs8riWnkucqyHKdFPffccwH4vZ751YdIzHGPSVbiKF1IrOfIkbm6Lx06dLC2SM18zfnkk0+sLceJXw1wpARv9/333wcA7LbbbraNXwNIuk/22OUYbpFGsxq7GxWJTQdyUrHE6wLAl19+aW05l1he5vnJr1KkndNIyj0AyJ1DrhrV5UBXvIqiKIqSIhVb8bpWUHEznLhWDvwEP27cOGufcsopAPwrXobj72S1xo4tvAqRlct2221n24JWGYJrlRsUj5YF5HhwH3fddde8zzmzDDv6COxwdfvtt1v7kUcesbasPLbaaivbxgpE1qmfNY3nssuBLugckCd6XsWy/ec//xkA0K5dO+f2xcnHFdtbf1tvv/02AKBfv362jZ2ykipakmWuuOIKAH4HsrFjx+b93bJly6x98803W3vgwIEA/LHK/fv3t/Yee+xhbRlnrvG99dZbW3v06NEA/MdWVsFAbjX27LPPFtynhoZcawGgpqYGQE4dCIIdEvn6xMdRzqW5c+faNo6Jf+WVVwAAPXv2jNLtktEVr6IoiqKkiN54FUVRFCVFKiY1uySruDIWx8/dcccdAIB77rnHtm2xxRbW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\n",
      "text/plain": [
       "<Figure size 576x576 with 25 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "####################################\n",
    "### RELOAD & GENERATE SAMPLE IMAGES\n",
    "####################################\n",
    "\n",
    "\n",
    "n_examples = 25\n",
    "\n",
    "with tf.Session(graph=g) as sess:\n",
    "    saver.restore(sess, save_path='./gan.ckpt')\n",
    "\n",
    "    batch_randsample = np.random.uniform(-1, 1, size=(n_examples, gen_input_size))\n",
    "    new_examples = sess.run('generator/generator_output:0',\n",
    "                            feed_dict={'generator_input:0': batch_randsample,\n",
    "                                       'dropout:0': 0.0,\n",
    "                                       'is_training:0': False})\n",
    "\n",
    "fig, axes = plt.subplots(nrows=5, ncols=5, figsize=(8, 8),\n",
    "                         sharey=True, sharex=True)\n",
    "\n",
    "for image, ax in zip(new_examples, axes.flatten()):\n",
    "    ax.imshow(image.reshape((dis_input_size // 28, dis_input_size // 28)), cmap='binary')\n",
    "\n",
    "plt.show()"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
